低延迟交易系统设计
随着中国证券市场对海外的开放,担忧国内一些机构还在使用陈旧的技术被人家割韭菜,然后有些机构风气也很不好,其实很简单的东西,总是神叨叨的以为自己都懂还是绝顶的商业机密,所以来写一个短文吧,让不知道的学一点,知道的就一笑而过吧。
本文主要分几个部分,第一部分是交易所低延迟系统架构给交易所的朋友们看的,当然有些券商也有自己的场外期权交易部门也可以看看。第二部分是券商和私募机构用的低延迟交易系统。第三部分是针对最近股票期权的做市商系统,当然你也可以理解为程序化交易,程序化套利,高频/低延迟交易,我只是选了一个合规的词,同时相对于股票和期货,选择了较复杂的期权系统给读者做交流。
1.交易所交易系统
通常整个交易系统架构如下,原有的交易系统采用多品种在一台小型机上进行集中式处理,网络则同时承载了行情/报盘/清算等数据传输。
低延迟的交易系统能够承受更大量的订单,以某交易所为例,其交易延低延迟的交易系统能够承受更大量的订单, 以某交易所为例,其交易延迟从2004年的127ms下降到2016年278us,订单数增长了近1000倍。延迟从2004年的127ms下降到2016年278us,订单数增长了近1000倍。
分布式撮合系统
独立的消息总线
低延迟通信网络
通常为了降低延迟提高系统并发处理能力采用的方案都是使用分布式处理,我国A股交易品种已经多达3800只,还有大量的期货期权等衍生品交易。分布式调度算法相对简单,即把不同的代码放置在不同的服务器进行交易撮合即可。
当然分布式系统最重要的便是时间一致性的处理,传统的方式服务器可以通过网络使用NTP协议同步时钟,但是随着交易频率越来越高和交易公平性的需求,通常需要在各个交易服务器及报盘前置上进行时钟同步和时间戳标记,严格执行公平的价格优先时间优先交易策略。一种方法是使用网络交换机接收GPS时钟源并通过网络带内的PTP协议同步时钟,而带内传输需要考虑网络通信流量和交换机转发时延带来的干扰,另一种方式则是使用GPS等时钟信号带外同步。
对于交易等时钟敏感的业务,如果不考虑成本需求,可以采用第二种构建单独的带外时钟同步系统。而针对报盘前置,通常需要在报文中对到达时间进行精确标记供交易撮合服务器定序。
注:如果采用基于PTP的方案,低延迟交换机建议使用基于FPGA的L1 FanOut交换机构建独立的时钟网络,但是会多占用服务器的一个网口。而可以采用带有SMA接口和OXCO晶振构建本地的时钟同步和守时系统,具体技术细节在1.1.3中详细讨论。
从业务模式上来看,撮合服务器承担了大量的通信流量,同时连接了报盘/行情/清算三条交易总线,使用同一套网络传输会潜在的影响,影响了整个交易的公平性并使得交易系统极端性能的处理能力受限。
而通信模式上具有相对固定的特征,因此可以在通信系统中可以将总线分离,并配置特殊的网络设备加速每一种业务模式:
报盘和分布式撮合涉及订单分发,它为标准的多对多通信模式,通常只能选择普通的基于MAC地址查询的低延迟ASIC交换机,例如Cisco Nexus3548和Arista 7150。
清算总线为标准的多对一通信,而行情汇总总线也为标准的多对一通信模式,通常无需使用MAC地址查询,直接将报文转发到特定端口即可。在这种场景下,可以使用带有低延迟MAC IPCORE的FPGA交换机实现, 例如Cisco的FusionMux和Arista MetaMux技术构建的交换机。
行情分发给会员单位时为标准的一对多通信模式,也可以采用L1交换机直接将数据复制到多个出口,而无需使用组播OIF查询机制,同样Cisco和Arista都提供这样的交换机产品。
注意:在行情分发网络中,曾经也有部分采用模块化交换机或者路由器,由于设备组播复制机制不同,会存在行情分发不公平的情况,而使用L1交换机Fan Out和级联FanOut可以保证行情的完全公平。
证券交易网络通信通常具有一个非常明显的特征:Microburst。即从宏观结构上来看,平均每秒流量非常小:
但是缩放到毫秒级刻度,则会出现链路使用率几乎满载的情况:
因此微观传输时延变得非常重要,常见网络传输时延统计:
使用更低延迟的交换机和更大的带宽通常可以缓解延迟,但是在较高带宽时需要考虑到编码带来的时延。通常每次burst时传输的数据包数量相对较小,而高速带宽通常使用大量的FEC和编码技术反而增大了传输延迟,最佳的解决方案为10Gbps光纤网络或者部分可以禁用RS-FEC的25Gbps光纤网络(例如Cisco部分交换机可以支持在30米距离内使用高质量光纤禁用RS-FEC),同时在短距离内,为了进一步降低传输延迟,可以采用无源的铜质直连线(Passive Twinax Direct Attached Cable)
另一方的优化在系统侧,大量的交易应用程序基于TCP通信,而经典的Linux内核实现也使得TCP通信延迟相对较高,同时伴随着多对一通信模式下的TCP incast带来的延迟。
业界为了解决这个问题,通常采用如下几种做法:
使用InfiniBand网络重构通信,但是由于交易所开发资源受限和项目潜在风险较高,且IB网络成本等多种因素的影响,仅有极少数交易所采用
ROCE(RDMAover Converged Ethernet):大量的对于通信有低延迟需求的行业(AI/存储/消息队列)已经开始使用,例如在存储和AI训练等众多方案中都开始采用,Nvidia甚至因为这个技术收购了Mellanox。阿里云等企业也开始大面积部署ROCE等技术。但对于交易所行业而言,同样需要在传统的TCP通信代码上进行较大的改动,因此进展缓慢。
Kernel Bypass:这种技术是交易所现阶段使用较多的技术,通过特定的网卡和驱动实现,上层应用则继续仅作较小的修改,这类技术包括Solarflare的Onload和Exablaze的 ExaSOCK
TCP Offload:即在FPGA上构造TCP状态机和应用逻辑,完全脱离于主机执行交易相关的数据处理,交易所可以在这个场景中实现对交易订单的价格优先/时间优先定序,并在满足可执行撮合条件时通知主机进行撮合。常通常这部分如下图所示:
也有混合TCP Offload Engine和TCP Kernelbypass技术的解决方案,例如Exablaze的FDK-XP
除此之外,在主机侧的优化则集中在CacheLine对齐,BIOS调整禁用CPU省电降频,使用高频率CPU和绑定CPU核等技术。未来几年还有基于CXL等技术来进一步降低网卡到CPU的通信延迟。
2.证券期货公司交易系统
证券期货等交易系统架构如下图所示:
延迟衡量的标准为T3-Delay(Tick-to-TradeDelay)即收到行情后可以在多快发出交易订单指令。
由于我国特殊的涨跌停交易制度,使得大量的机构需要准确测量交易所时间并第一时间送入订单对涨跌停股票进行交易。而某交易所报盘的机制也使得机构需要使用精确时钟去测量,并实现守时系统。通常的做法和前述交易所内部分布式系统时钟同步的解决方法类似,通过对交易所过来的信息构建时钟同步逻辑,并采用在网卡上配备OXCO恒稳晶振的做法进行守时处理。
而通常也需要一套系统对T3-Delay进行监控,通常的做法是对报文直接进行Taping并打上高精度的时间戳,某些时候为了兼容Wireshark等分析软件,通常可以在报文的尾部添加时间戳信息,或者构造ERSPAN Type-3 Header放置时间戳,具体实现可以参考Arista收购的Metamako MetaWatch和思科收购的Exablaze ExaLink FunsionHPT
从交易所收到行情后通常需要一个交换机分发给多个内部服务器,此处为标准的一对多通信模式,可以采用L1 FanOut的方式,使用特殊定制的基于FPGA的交换机(Arista 7130或者Exablaze Fusion L1)实现。还有一部分可以采用FPGA对行情过滤和重编码的方式降低传输带宽和策略服务器解码时间。
报盘加速则是标准的多对一通信模式,同样可以使用特殊定制的基于FPGA的交换机实现
主机侧加速的方案和交易所方案也类似,采用特定的网卡进行Kernel Bypass。通常交易所限制使用特殊的lib库进行交易,任何其它的方式可能带来潜在的违规风险就不多做描述了。因此在这样的监管体系下,大多数交易指令的下发采用Solarflare onload和Exablaze ExaSOCK的方式进行,因为无需对报盘系统做代码修改。而在行情接收上,也有使用solarflare ef_vi对接收队列直接操作,而Exablaze则可以基于FPGA直接使用RTL对接受行情编码处理和计算,并产生计算结果告知CPU侧,具体内容可以在第三章中的实例找到。
3.做市商系统
伴随着我国期权交易逐步放开,特别是未来个人股票期权程序化交易放开,期权做市商系统或者程序套利算法成为各个机构追捧的业务类型。做市商是指持续为做市合约提供买卖双边报价,并且在该价位上接受投资者的买卖需求,以自有账户和资金与投资者进行交易的交易商。
做市商主要的任务是在尽量避免影响市场价格的前提下,对做市合约进行连续的双边报价,为市场提供流动性。一般来说,做市商需要具有雄厚的资金实力、准确的报价能力和风险管理能力。
3.2.2 行情过滤和重编码
重编码的方法很多,需要具体的算法结合,采用预处理的方式
3.2.3 行情分发
对于期权来说,通常会有多种行权价格多种期限的品种
当然这种按照到期日区分的主要用于平价(Call-Put-Parity)套利策略,还有一些例如果冻卷(JellyRoll)或者日历价差需要跨期套利则可以根据行权价格分发到不同的策略服务器。
平价套利策略的原理基于如下的平价公式产生的,即在忽略市场交易成本的情况下,相同标的资产且执行价格也相同/到期日也相同的认购期权和认沽期权与标的资产之间的价格满足如下公式关系,并假设假设标的资产不分红:
1. 卖出行权价K的认购期权
2. 买入行权价为K的认沽期权
3. 买入现货标的
theta
:期权的时间价值随时间流逝的损耗速度,它是期权价格关于到期时间的一阶导数rho
:利率变动对期权价格的影响,即期权价格关于无风险利率的一阶导数部分已有C++计算程序的机构,如果机构有特别有经验的FPGA工程师也可以直接使用verilog实现,当然也可以通过Xilinx Vivado HLS将其转为FPGA的IP core,并将计算Offload到FPGA网卡中:
在HLS中还需要对计算的循环展开模式做精心的调整及数据位宽做调整。通常这一系列计算可以在Arista 7130交换机,Cisco Exablaze Fusion交换机或者Exablaze系列网卡上实现,它们都是基于Xilinx的FPGA实现的。
当期权的波动率曲面构建后,做市商可对一些不活跃的合约根据波动率曲面进行合理的报价,同时还可以根据波动率曲面进行蝶式套利或日历套利。例如出现突发未知情况时,近期的隐含波动率涨幅远远大于远期,因此可以做空近月波动率,做多远月波动率实现。